package events

import (
	"context"
	"time"

	"BookStack/pkg/utils"
)

// Event 事件接口
type Event interface {
	// 事件类型
	EventType() string

	// 事件数据
	EventData() interface{}

	// 事件ID
	EventID() string

	// 事件发生时间
	EventTime() time.Time
}

// BaseEvent 基础事件实现
type BaseEvent struct {
	ID        string      // 事件ID
	Type      string      // 事件类型
	Data      interface{} // 事件数据
	Timestamp time.Time   // 事件时间戳
}

// EventType 实现Event接口
func (e *BaseEvent) EventType() string {
	return e.Type
}

// EventData 实现Event接口
func (e *BaseEvent) EventData() interface{} {
	return e.Data
}

// EventID 实现Event接口
func (e *BaseEvent) EventID() string {
	return e.ID
}

// EventTime 实现Event接口
func (e *BaseEvent) EventTime() time.Time {
	return e.Timestamp
}

// NewEvent 创建新事件
func NewEvent(eventType string, payload interface{}) Event {
	now, _ := time.Parse(utils.StandardTimeFormat, utils.Now())
	return &BaseEvent{
		ID:        generateEventID(),
		Type:      eventType,
		Data:      payload,
		Timestamp: now,
	}
}

// generateEventID 生成唯一事件ID
func generateEventID() string {
	return utils.Now() + RandomString(8)
}

// RandomString 生成随机字符串
func RandomString(n int) string {
	const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	b := make([]byte, n)
	for i := range b {
		b[i] = letters[time.Now().UnixNano()%int64(len(letters))]
		time.Sleep(1 * time.Nanosecond)
	}
	return string(b)
}

// EventHandler 事件处理器接口
type EventHandler interface {
	// 处理事件
	Handle(ctx context.Context, event Event) error
}

// Publisher 事件发布者接口
type Publisher interface {
	// 发布事件(同步)
	Publish(ctx context.Context, event Event) error

	// 异步发布事件
	AsyncPublish(ctx context.Context, event Event)

	// 订阅事件
	Subscribe(eventType string, handler EventHandler)

	// 取消订阅
	Unsubscribe(eventType string, handler EventHandler)
}
